#include <minix/const.h>
#include "libacl.h"

int aclsetuid(char* fname,short uid,short permisos) {
    int i;
    int r;

    short lista[ITEMS_ACL];
    for (i = 0; i < ITEMS_ACL; i++) lista[i] = 0;

    /* Si no puedo obtener la ACL, devuelvo el codigo de error */
    r = aclget(fname, lista);
    if (r != ACL_OK && r != INODO_SIN_ACL) {
        return r;
    }

    /* Chequeo que no se este intentando agregar al terminador */
    if (uid == 0) {
        return BAD_USR;
    }

    /* Busco el usuario en la ACL existente */
    for (i = 0; i < ITEMS_ACL; i += 2) {
        if (lista[i] == uid) {
            lista[i+1] = permisos;
            r = aclset(fname, lista);
            return r;
        }
        if (lista[i] == 0) {
            lista[i] = uid;
            lista[i+1] = permisos;
            r = aclset(fname, lista);
            return r;
        }
    }

    /* Si se completo el ciclo, la ACL estaba llena
     * y no hay lugar para acomodar al usuario. */
    if (i == ITEMS_ACL) {
        return FULL_ACL;
    }
    return r;
}

int acldeluid(char* fname,short uid) {
    int i;
    int r;

    short lista[ITEMS_ACL];
    for (i = 0; i < ITEMS_ACL; i++) lista[i] = 0;

    /* Si no puedo obtener la ACL, devuelvo el codigo de error */
    r = aclget(fname, lista);
    if (r != ACL_OK) {
        return r;
    }

    /* Chequeo que no se este intentando borrar el terminador */
    if (uid == 0) {
        return BAD_USR;
    }

    /* Busco el usuario en la ACL */
    for (i = 0; i < ITEMS_ACL; i += 2) {
        if (lista[i] == 0) {
            break;
        }
        if (lista[i] == uid) {
            break;
        }
    }

    if (i == ITEMS_ACL || lista[i] == 0) {
        /* El usuario no estaba en la ACL, no hay nada que borrar */
        return 0;
    } else {
        /* El usuario estaba en la ACL en la posicion i, atraso
         * las demas posiciones uno para atras y pongo 0 al final */
        i = i+2;
        while (i < ITEMS_ACL) {
            lista[i-2] = lista[i];
            lista[i-1] = lista[i+1];
            i += 2;
        }
        lista[i-2] = 0;
        lista[i-1] = 0;

        /* Guardo los cambios */
        r = aclset(fname, lista);
    }
    return r;
}

int aclclear(char* fname) {
    int r;
    r = aclset(fname, 0);
    return r;
}
